package com.yk.test.config.oauth2;

import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;

import java.util.Date;

/**
 * redis自动续期
 */
public class MyRedisTokenStore extends RedisTokenStore {



    public MyRedisTokenStore(RedisConnectionFactory connectionFactory) {
        super(connectionFactory);
    }


    @Override
    public OAuth2Authentication readAuthentication(OAuth2AccessToken token) {
        OAuth2Authentication result = readAuthentication(token.getValue());
        if (result != null) {
                //如果是password的模式token时间自动续期
            if(result.getOAuth2Request().getRequestParameters().get("grant_type").equals("password")){
                // 如果token没有失效  更新AccessToken过期时间
                DefaultOAuth2AccessToken oAuth2AccessToken = (DefaultOAuth2AccessToken) token;
                //重新设置过期时间
                if (oAuth2AccessToken.getExpiresIn() > 0) {
                    oAuth2AccessToken.setExpiration(new Date(System.currentTimeMillis() + (RedisTokenUtil.REDIS_TOKEN_TIME * 1000L)));
                }
                //将重新设置过的过期时间重新存入redis, 此时会覆盖redis中原本的过期时间
                storeAccessToken(token, result);
            }
        }
        return result;
    }

}
